// 1.时间是我们项目中最常用的一类工具，现要求大家开发一个函数计算一个给定时间戳距离当前的时间距离，复数加s
// 一天以上则显示多少天，如三天显示3days
// 一天以内，一小时以上则显示多少小时，如五小时则显示5hours
// 一小时以内，则显示多少分钟，如一分钟则显示1minute

function formatTime(num: number) {
  const m = Math.floor((num / 1000 / 60) % 60);
  const h = Math.floor((num / 1000 / 60 / 60) % 24);
  const d = Math.floor(num / 1000 / 60 / 60 / 24);

  if (d) return `${d}day${d === 1 ? "" : "s"}`;
  if (h) return `${h}hour${h === 1 ? "" : "s"}`;
  if (m) return `${m}minute${m === 1 ? "" : "s"}`;
}

// const s = formatTime(1000 * 60 * 60 * 24 * 5)   // => 5days
// const s1 = formatTime(1000 * 60 * 60 * 20)   // => 20hours
// const s2 = formatTime(1000 * 60 * 10)   // => 30minutes
// console.log(s, s1, s2);

// 2.引用数据类型的特殊性要求我们在项目中需要经常实现引用数据（主要考虑数组和对象）的深拷贝，现要求大家开发一个可以对引用数据类型深拷贝的函数，思路如下：

// a.判断要进行深拷贝的是数组还是对象，是数组的话进行数组拷贝，对象的话进行对象拷贝
// b.进行深拷贝的不能为null
// c.遇到内部属性是数组或对象的，考虑使用递归

// interface anyObject {
//   [propName: string]: any;
// }

// function deepClone<T>(obj: T): any {
//   // 排除null
//   if (obj === null) return;
//   //  排除 数组 对象
//   if (typeof obj !== "object") return obj;
//   // 数组  对象
//   let result: any[] | anyObject = [];

//   if (Array.isArray(obj)) {
//     result = [];
//     obj.forEach((v) => {
//       result.push(deepClone(v));
//     });
//   } else {
//     result = {};
//     Object.keys(obj).forEach((key) => {
//       (result as anyObject)[key] = deepClone((obj as anyObject)[key]);
//     });
//   }
//   return result;
// }
// const o = {
//   name: "张三",
//   list: [
//     {
//       age: 18,
//       children: [
//         {
//           sex: "男",
//         },
//       ],
//     },
//   ],
// };
// const o1 = o;
// const o2 = deepClone(o);
// o1.name = "李四";
// o2.list[0].age = 20;
// o1.list[0].age = 22;

// console.log(o);

// 3. 实现一个数组扁平化的方法flattenByDeep(array,deep)，根据传入的数组和展开层级，输出扁平化后的数组
// 如：

// 定义类型
type DeepArrayNumber = Array<number | DeepArrayNumber>;

function flattenByDeep(arr: DeepArrayNumber, len: number): DeepArrayNumber  {
  let list: DeepArrayNumber = [];

  for (let i = 0; i < len; i++) {
		list = []
    arr.forEach((v) => {	
			list = list.concat(v)
			arr = list
		});
  }
	
	return list
}

flattenByDeep([1, 2, 3, 4, [5, [6, 7, [8, 9]]]], 1); // =>[1,2,3,4,5,[6,7,[8,9]]]
flattenByDeep([1, 2, 3, 4, [5, [6, 7, [8, 9]]]], 2); // =>[1,2,3,4,5,6,7,[8,9]]
flattenByDeep([1, 2, 3, 4, [5, [6, 7, [8, 9]]]], 3); // =>[1,2,3,4,5,6,7,8,9]

// 4. 上述要求中的函数均用ts实现，涉及的参数类型声用interface申明，对于参数内部属性名不确定的考虑使用索引类型定义
// // （四）评分标准：
// 1.正确理解题意
// 2.配置typescript开发环境，初始化typescript开发项目
// 3.使用typescript语法完成题目要求
// 4.正确定义时间戳计算函数，声明函数的返回值，参数类型
// 5.正确计算出给定时间戳距当前时间的距离
// 6.对于距离当前时间为复数的，单位上添加s
// 7.正确定义引用类型深拷贝函数，声明函数的返回值
// 8.声明深拷贝函数的参数类型，对于不确定的参数考虑索引类型
// 9.实现数组和对象的区分，数组使用数组的深拷贝方法，对象使用对象的深拷贝方法
// 10.判断深拷贝的对象不能为null
// 11.判断内部属性是数组或对象的，使用递归调用拷贝
// 12.声明数组扁平化方法，指定参数类型和返回值类型
// 13.flattenByDeep返回值为数组，使用联合类型定义数组项
// 14.实现flattenByDeep的函数功能
// 15.测试flattenByDeep满足案例1
// 16.测试flattenByDeep满足案例2
// 17.测试flattenByDeep满足案例3
// 18.在录屏中运行并测试三个函数
// 19.核心代码有注释，页面功能正常无bug
// 20.单独录制题目要求的效果视频并使用其他颜色标注实现的功能
